package com.iwhalecloud.bss.kite.cucc.client.api.scene;

import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.iwhalecloud.bss.kite.client.dto.DataResult;
import com.iwhalecloud.bss.kite.client.vo.scene.ProdRoleModuleVO;
import com.iwhalecloud.bss.kite.cucc.client.dto.cust.CuccContextCustDTO;
import com.iwhalecloud.bss.kite.cucc.client.dto.customerOrderInformation.QryGrpMemberDTO;
import com.iwhalecloud.bss.kite.cucc.client.dto.pay.ResaleOrderRequest;
import com.iwhalecloud.bss.kite.cucc.client.dto.pos.KitePosDTO;
import com.iwhalecloud.bss.kite.cucc.client.vo.scene.CuccOfferInitVO;
import com.iwhalecloud.bss.kite.manager.dto.KiteAttrDTO;

public interface ICuccSceneService {

    /**
     * 从es获取购物车ID
     * @return
     */
    DataResult<String> getCartIdFromES();

    /**
     * 创建订购受理场景
     * @param offerVO
     * @return
     */
    DataResult<String> createOrderOfferScene(CuccOfferInitVO offerVO);

    /**
     * 根据订单详情创建场景
     * @param orderId
     * @param serviceOfferId
     * @param custId
     * @param custName
     * @param staffId
     * @param lanId
     * @param regionId
     * @param cartId
     * @return
     */
    DataResult<Map<String, Object>> createOfferScene(String serialNumber, List<QryGrpMemberDTO> memSerialNumbers, String prodId, String serviceOfferId, String custId, String custName,
            String staffId, String lanId, String regionId, String cartId, String userId);

    /**
     * 根据订单详情创建场景
     * @param orderId
     * @param serviceOfferId
     * @param custId
     * @param custName
     * @param staffId
     * @param lanId
     * @param regionId
     * @return
     */
    DataResult<String> createOfferSceneByOrderDetailInfo(String orderId, String serviceOfferId, String custId, String custName,
                                             String staffId, String lanId, String regionId, String operType);


    /**
     * 根据工单信息创建场景（工单ID和任务ID必传一个）
     *
     * @param orderId 订单ID
     * @param flowId 工单ID
     * @param taskId 任务ID
     * @param serviceOfferId
     * @param custId
     * @param custName
     * @param staffId
     * @param lanId
     * @param regionId
     * @return
     */
    /*DataResult<Map<String, Object>> createOfferSceneByWorkOrder(String orderId, String flowId, String taskId, String serviceOfferId, String operType, String custId, String custName,
                                            String staffId, String lanId, String regionId);*/


    /**
     * 根据工单信息创建场景（工单ID和任务ID必传一个）
     * 增加一个订单来源参数
     * @param orderId 订单ID
     * @param flowId 工单ID
     * @param taskId 任务ID
     * @param serviceOfferId
     * @param custId
     * @param custName
     * @param staffId
     * @param lanId
     * @param regionId
     * @param orderSource
     * @return
     */
    DataResult<Map<String, Object>> getOfferSceneDataByWorkOrder(String orderId, String flowId, String taskId, String serviceOfferId,
        String operType, String custId, String custName, String staffId, String lanId, String regionId, String orderSource);

    /**
     * 根据工单信息创建场景（工单ID和任务ID必传一个）-收费方产品-代办发起的预销户使用
     * @param orderId 订单ID
     * @param flowId 工单ID
     * @param taskId 任务ID
     * @param serviceOfferId
     * @param orderSource 订单来源
     * @return
     */
    DataResult<Map<String, Object>> getOfferSceneDataForChargePreCancel(String orderId, String flowId, String taskId, String serviceOfferId, String orderSource);

    /**
     * 根据订单详情创建场景
     * @param orderId
     * @param serviceOfferId
     * @param operType
     * @param custId
     * @param custName
     * @param staffId
     * @param lanId
     * @param regionId
     * @return
     */
    DataResult<Map<String, Object>> getOfferSceneDataByOrderDetailInfo(String orderId, String serviceOfferId, String operType, String custId,
        String custName, String staffId, String lanId, String regionId);

    /**
     * 更新属性值
     * @param sceneInstId
     * @param attrs
     * @param offerInstId
     */
    void updateInstAttr(String sceneInstId, String offerInstId, List<KiteAttrDTO> attrs);

    /**
     * 根据订单信息/用户信息创建场景
     * @param serviceOfferId 服务提供
     * @param operType 操作类型
     * @param askSource 订单来源
     * @param custId
     * @param custName
     * @param staffId
     * @param lanId
     * @param regionId
     * @param kitePosDTO
     * @return
     */
    DataResult<String> createOfferScene(String serviceOfferId, String operType, String askSource, String custId, String custName,
                            String staffId, String lanId, String regionId, KitePosDTO kitePosDTO);

    /**
     * 初始化变更场景
     * @param serviceOfferId
     * @param operType
     * @param askSource
     * @param custId
     * @param custName
     * @param staffId
     * @param lanId
     * @param regionId
     * @param kitePosDTO
     * @return
     */
    DataResult<String> initModifyScene(String serviceOfferId, String operType, String askSource, String custId, String custName,
        String staffId, String lanId, String regionId, KitePosDTO kitePosDTO);

    /**
     * 还原属性值，包括公共属性，产品属性，合同，付费关系等（业务变更还原）
     * @param sceneInstId
     * @param operType
     * @param custId
     * @param staffId
     * @param kitePosDTO
     * @return
     */
    DataResult<Boolean> initSceneAttrValues(String sceneInstId, String operType, String custId, String staffId, KitePosDTO kitePosDTO);

    /**
     * 用于异步还原合同，账户等需要调接口获取的信息
     * @param sceneInstId
     * @param custId
     * @param staffCode
     * @param provinceId
     * @param kitePosDTO
     * @return
     */
    DataResult<Boolean> initMoreSceneAttrValues(String sceneInstId, String custId, String staffCode, String provinceId, KitePosDTO kitePosDTO);

    /**
     * 还原属性值，包括公共属性，产品属性，合同，付费关系等（订单修改还原）
     * @param sceneInstId
     * @param operType
     * @param custId
     * @param staffId
     * @param orderId
     * @param serviceOfferId
     * @param upServiceOfferId
     * @param serviceOfferIdList
     * @param worksheetData
     * @param kitePosDTO
     * @param orderData
     * @return
     */
    DataResult<Boolean> initModifySceneAttrValues(String sceneInstId, String operType, String custId, String staffId, String orderId,
                                                  String serviceOfferId, String upServiceOfferId, List<String> serviceOfferIdList,
                                                  Map<String, Object> worksheetData, KitePosDTO kitePosDTO, JSONObject orderData);

    /**
     * app甩单订购初始化，回显甩单信息
     * @author zhang.song
     * @date 2021-08-18 19:53
     * @param sceneInstId
     * @param offerVO
     * @return com.iwhalecloud.bss.kite.client.dto.DataResult<java.lang.Boolean>
     */
    DataResult<Boolean> initRejectionSceneAttrValues(String sceneInstId, CuccOfferInitVO offerVO);

    /**
     *
     * @param sceneInstId
     * @param operType
     * @param custId
     * @param staffId
     * @param orderId
     * @param kitePosDTO
     * @return
     */
    DataResult<Boolean> initDetailSceneAttrValues(String sceneInstId, String serviceOfferId, String operType,
        String cartId, String custId, String staffId, String orderId, String businessType,
        Map<String, Object> orderInfo, KitePosDTO kitePosDTO, String preTaskCode);

    /**
     * 获取产品角色对象
     * @param roleId
     * @param prodId
     * @param prodInstId
     * @param templateId
     * @param offerId
     * @return
     */
    DataResult<ProdRoleModuleVO> getProdRoleModuleVO(String roleId, String prodId, String prodInstId, String templateId, String offerId);

    /**
     * 打印模板
     * @param sceneInstId
     * @param serviceOfferId
     * @return
     */
    DataResult<Map<String, Object>> dealPrintTemplate(String sceneInstId, String serviceOfferId);

    /**
     * 回显订单概要信息
     * @param orderId
     * @param sceneInstId
     * @param orderData
     * @param worksheetData
     * @return
     */
    DataResult<Boolean> saveOrderSummaryInfo(String orderId, String sceneInstId, KitePosDTO kitePosDTO, JSONObject orderData, Map<String, Object> worksheetData);

    /**
     * 获取所有号码（主号+成员）的变更单信息
     * @param hasMember
     * @param productId
     * @param custId
     * @param serialNumber
     * @param provinceId
     * @param lanId
     * @param staffCode
     * @param kitePosDTO
     * @return
     */
    DataResult<Map<String, Object>> getAllChangeOriginOrder(boolean hasMember, List<QryGrpMemberDTO> memSerialNumbers, String productId,String custId, String serialNumber, String provinceId, String lanId, String staffCode, String userId);

    /**
     * 从用户中心获取user_id
     * @return
     */
    DataResult<Map<String, Object>> initUserIdFromUserCenter(String sceneInstId, CuccContextCustDTO custDTO);

    /**
     * 初始化产品下的属性分组实例ID
     * @param sceneInstId
     * @param custId
     * @param spuId
     * @return
     */
    DataResult<Boolean> initAttrGroupInstIdFromUserCenter(String sceneInstId, String custId, CuccContextCustDTO custDTO);

    /**
     * 设置上级商品信息
     * @param sceneInstId
     * @param custId
     * @param spuId
     * @return
     */
    DataResult<Boolean> initParentOfferInfo(String sceneInstId, String custId, String spuId);

    /**
     * 查询成员业务号码
     * @param serialNumber
     * @return
     */
    DataResult<List<QryGrpMemberDTO>> queryMemberSerialNumbers(String offerId, String serialNumber);

    /**
     * 创建返销场景
     * @param resaleOrderRequest
     * @param userKitePosDTO
     * @return
     */
    DataResult<String> createResaleScene(ResaleOrderRequest resaleOrderRequest, KitePosDTO userKitePosDTO);
}
